/**********************************************************************************
 * $URL:  $
 * $Id:  $
 ***********************************************************************************
 *
 * Copyright (c) 2003, 2004, 2005, 2006, 2008 Sakai Foundation
 *
 * Licensed under the Educational Community License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.opensource.org/licenses/ECL-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 **********************************************************************************/

package org.sakaiproject.event.api;

import java.time.Instant;
import java.util.List;


/**
 * Event delayers delay an event for future propagation by the system.
 */
public interface EventDelayHandler
{
	/**
	 * Read an event delay by a specified delay ID.
	 * 
	 * @param delayId
	 * @return
	 */
	Event readDelay(String delayId);

	/**
	 * Read a list of event delay IDs using the provided event and user ID.
	 * 
	 * @param event
	 * @param userId
	 * @return
	 */
	List<String> findDelayIds(Event event, String userId);

	/**
	 * Read a list of event delay IDs using the provided event. Does not look at the user ID.
	 * 
	 * @param event
	 * @return
	 */
	List<String> findDelayIds(Event event);

	/**
	 * Read a list of event delay IDs using resource and event.
	 * 
	 * @param resource
	 * @param event
	 * @return
	 */
	List<String> findDelayIds(String resource, String event);

	/**
	 * Read a list of event delay IDs using resource and event.
	 * 
	 * @param resource
	 * @return
	 */
	List<String> findDelayIds(String resource);

	/**
	 * Schedules a delayed invocation of this notification to run at the requested time.
	 * 
	 * @param event
	 * @return The ID of the delay
	 */
	String createDelay(Event event, Instant fireTime);

	/**
	 * Schedules a delayed invocation of this notification to run at the requested time.
	 * 
	 * @param event
	 * @param userId
	 * @return The ID of the delay
	 */
	String createDelay(Event event, String userId, Instant fireTime);

	/**
	 * Delete an event delay by referencing the delay ID.
	 * 
	 * @param delayId
	 * @return
	 */
	boolean deleteDelayById(String delayId);

	/**
	 * Delete an event delay by matching the event information.
	 * 
	 * @param e
	 * @return
	 */
	boolean deleteDelay(Event e);

	/**
	 * Delete a delayed event by matching resource and event
	 * 
	 * @param resource
	 * @param event
	 * @return
	 */
	boolean deleteDelay(String resource, String event);

	/**
	 * Delete all delayed events for a resource
	 * 
	 * @param resource
	 * @return
	 */
	boolean deleteDelay(String resource);
}
